home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Hardcore Gamer Resource Kit
/
Hardcore Gamer Resource Kit - Disc 2.iso
/
Utils
/
UNIX
/
UNZIP520
/
WINGUI
/
WIZUNZIP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-04-23
|
19KB
|
490 lines
/****************************************************************************
PROGRAM: WizUnZip.c
PURPOSE: Windows Info-ZIP Unzip, an Unzipper for Windows
FUNCTIONS:
WinMain() - calls initialization function, processes message loop
WizUnzipInit() - initializes window data and registers window
WizUnzipWndProc() - processes messages
About() - processes messages for "About" dialog box
AUTHOR: Robert A. Heath, 157 Chartwell Rd. Columbia, SC 29210
I place this source module, WizUnzip.c, in the public domain. Use it as
you will.
Modifications: M. White - 1995, 1996
- Ported to Borland C
- Ported to WinNT and Win95
- Added dll functionality
****************************************************************************/
#define UNZIP_INTERNAL
#include "unzip.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <string.h>
#include "wingui\wizunzip.h"
#include "wizdll\wizdll.h"
#ifdef WIN32
#include <winver.h>
#else
#include <ver.h>
#endif
#ifdef WIN32
#define UNZ_DLL_NAME "WIZUNZ32.DLL"
#else
#define UNZ_DLL_NAME "WIZUNZ16.DLL"
#endif
#ifndef WIZUNZIPDLL
static char __based(__segname("STRINGS_TEXT")) szFirstUse[] = "FirstUse"; /* first use keyword in WIN.INI */
char __based(__segname("STRINGS_TEXT")) szDefaultUnzipToDir[] = "DefaultUnzipToDir";
char __based(__segname("STRINGS_TEXT")) szDefaultUnzipFromDir[] = "DefaultUnzipFromDir";
char __based(__segname("STRINGS_TEXT")) szFormatKey[] = "Format"; /* Format keyword in WIN.INI */
char __based(__segname("STRINGS_TEXT")) szOverwriteKey[] = "Overwrite"; /* Overwrite keyword in WIN.INI */
char __based(__segname("STRINGS_TEXT")) szPromptOverwriteKey[] = "PromptOverwrite"; /* Prompt to Overwrite keyword in WIN.INI */
char __based(__segname("STRINGS_TEXT")) szExtractOnlyNewerKey[] = "ExtractOnlyNewer"; /* ExtractOnlyNewer keyword in WIN.INI */
char __based(__segname("STRINGS_TEXT")) szNeverOverwriteKey[] = "NeverOverwrite"; /* Overwrite keyword in WIN.INI */
char __based(__segname("STRINGS_TEXT")) szSaveUnZipToKey[] = "SaveZipToDir"; /* SaveZipToDir keyword in WIN.INI */
char __based(__segname("STRINGS_TEXT")) szSaveUnZipFromKey[] = "SaveZipFromDir"; /* SaveZipFromDir keyword in WIN.INI */
char __based(__segname("STRINGS_TEXT")) szTranslateKey[] = "Translate"; /* Translate keyword in WIN.INI */
char __based(__segname("STRINGS_TEXT")) szSpaceToUnderscoreKey[] = "SpaceToUnderscore"; /* Space to underscore keyword in WIN.INI */
char __based(__segname("STRINGS_TEXT")) szLBSelectionKey[] = "LBSelection"; /* LBSelection keyword in WIN.INI */
char __based(__segname("STRINGS_TEXT")) szRecreateDirsKey[] = "Re-createDirs"; /* re-create directory structure WIN.INI keyword */
char __based(__segname("STRINGS_TEXT")) szShowBubbleHelpKey[] = "ShowBubbleHelp"; /* re-create directory structure WIN.INI keyword */
char __based(__segname("STRINGS_TEXT")) szUnzipToZipDirKey[] = "UnzipToZipDir"; /* unzip to .ZIP dir WIN.INI keyword */
char __based(__segname("STRINGS_TEXT")) szHideStatus[] = "HideStatusWindow";
char __based(__segname("STRINGS_TEXT")) szAutoClearStatusKey[] = "AutoClearStatus";
char __based(__segname("STRINGS_TEXT")) szAutoClearDisplayKey[] = "AutoDisplayStatus";
char __based(__segname("STRINGS_TEXT")) szWizUnzipIniFile[] = "WIZUNZIP.INI";
char __based(__segname("STRINGS_TEXT")) szYes[] = "yes";
char __based(__segname("STRINGS_TEXT")) szNo[] = "no";
/* File and Path Name variables */
char __based(__segname("STRINGS_TEXT")) szAppName[] = "WizUnZip"; /* application title */
char __based(__segname("STRINGS_TEXT")) szStatusClass[] = "MsgWndw";/* status window class */
/* Values for listbox selection WIN.INI keyword
*/
char * LBSelectionTable[] =
{
"extract", "display", "test"
};
#define LBSELECTIONTABLE_ENTRIES (sizeof(LBSelectionTable)/sizeof(char *))
#endif /* WIZUNZIPDLL */
char __based(__segname("STRINGS_TEXT")) szHelpFileName[] = "WIZUNZIP.HLP";
HANDLE hInst; /* current instance */
HMENU hMenu; /* main menu handle */
HANDLE hAccTable;
HANDLE hHourGlass; /* handle to hourglass cursor */
HANDLE hSaveCursor; /* current cursor handle */
HANDLE hHelpCursor; /* help cursor */
HANDLE hFixedFont; /* handle to fixed font */
HANDLE hOldFont; /* handle to old font */
int hFile; /* file handle */
HWND hWndMain; /* the main window handle. */
HWND hWndList; /* list box handle */
HWND hWndStatus; /* status (a.k.a. Messages) window */
HWND hExtract; /* extract button */
HWND hDisplay; /*display button */
HWND hTest; /* test button */
HWND hShowComment; /* show comment button */
HWND hHelp; /* help button */
HWND hOpen; /* open button */
HWND hDeleteArchive; /* delete button */
HWND hCopyArchive; /* copy archive button */
HWND hMoveArchive; /* move archive button */
HWND hRenameArchive; /* rename archive button */
HWND hExit;
HWND hMakeDir;
HWND hSelectAll;
HWND hDeselectAll;
HWND hSelectPattern;
HWND hClearStatus;
HWND hCopyStatus;
HWND hUnzipToDir;
HWND hStatusButton;
HWND hListBoxButton;
HWND hSplitButton;
UF uf;
#ifndef WIZUNZIPDLL
WPARAM wLBSelection = IDM_LB_DISPLAY; /* default listbox selection action */
WPARAM wWindowSelection = IDM_SPLIT; /* window selection: listbox, status, both */
HBRUSH hBrush ; /* brush for standard window backgrounds */
LPUMB lpumb;
#endif /* !WIZUNZIPDLL */
LPDCL lpDCL;
HANDLE hDCL;
#ifdef USEWIZUNZDLL
HINSTANCE hWinDll;
FARPROC DllProcessZipFiles;
FARPROC GetDllVersion;
#endif
HANDLE hStrings;
int ofretval; /* return value from initial open if filename given */
WORD cZippedFiles; /* total personal records in file */
WORD cListBoxLines; /* max list box lines showing on screen */
WORD cLinesMessageWin; /* max visible lines on message window */
WORD cchComment; /* length of comment in .ZIP file */
#ifndef WIZUNZIPDLL
/* Forward References */
int WINAPI WinMain(HANDLE, HANDLE, LPSTR, int);
long WINAPI WizUnzipWndProc(HWND, WORD, WPARAM, LPARAM);
/****************************************************************************
FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
PURPOSE: calls initialization function, processes message loop
COMMENTS:
This will initialize the window class if it is the first time this
application is run. It then creates the window, and processes the
message loop until a WM_QUIT message is received. It exits the
application by returning the value passed by the PostQuitMessage.
****************************************************************************/
int WINAPI WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow)
HANDLE hInstance; /* current instance */
HANDLE hPrevInstance; /* previous instance */
LPSTR lpCmdLine; /* command line */
int nCmdShow; /* show-window type (open/icon) */
{
#ifdef USEWIZUNZDLL
DWORD dwVersion; /* These variables are all used for version checking */
WORD dllMajor, dllMinor;
DWORD dwVerInfoSize;
DWORD dwVerHnd;
char szFullPath[_MAX_PATH], *ptr;
#endif
int i;
BOOL fFirstUse; /* first use if TRUE */
if (!hPrevInstance) /* Has application been initialized? */
if (!WizUnzipInit(hInstance))
return 0; /* Exits if unable to initialize */
hStrings = GlobalAlloc( GPTR, (DWORD)sizeof(UMB));
if ( !hStrings )
return 0;
lpumb = (LPUMB)GlobalLock( hStrings );
if ( !lpumb )
{
GlobalFree( hStrings );
return 0;
}
hDCL = GlobalAlloc( GPTR, (DWORD)sizeof(DCL));
if (!hDCL)
{
GlobalUnlock(hStrings);
GlobalFree(hStrings);
return 0;
}
lpDCL = (LPDCL)GlobalLock(hDCL);
if (!lpDCL)
{
GlobalUnlock(hStrings);
GlobalFree(hStrings);
GlobalFree(hDCL);
return 0;
}
#ifndef USEWIZUNZDLL
CONSTRUCTGLOBALS();
#endif
uf.fCanDragDrop = FALSE;
#ifndef WIN32
if ((hHourGlass = GetModuleHandle("SHELL"))!=0)
{
if (GetProcAddress(hHourGlass, "DragAcceptFiles" ))
uf.fCanDragDrop = TRUE;
}
#else
uf.fCanDragDrop = TRUE;
#endif
#ifdef USEWIZUNZDLL
lpDCL->print = win_fprintf;
lpDCL->sound = SoundDuring;
lpDCL->Stdout = stdout;
lpDCL->lpUMB = lpumb;
/* Okay - we are now setting up to check the version stamp information
* in the dll. We aren't doing anything with it yet, because there is only
* one version of the dll, but this information will be useful for later
* versions. Note that we are assuming that the dll is in the same directory
* as the executable. Not a particularly valid assumption at this point, but
* it will do until we actually need this information.
*/
GetModuleFileName(hInstance, szFullPath, sizeof(szFullPath));
ptr = strrchr(szFullPath, '\\') + 1;
*ptr = '\0'; /* We've now got the path to the executable (application) */
lstrcat(szFullPath, UNZ_DLL_NAME);
dwVerInfoSize =
GetFileVersionInfoSize(szFullPath, &dwVerHnd);
if (dwVerInfoSize)
{
LPSTR lpstrVffInfo; /* Pointer to block to hold info */
HANDLE hMem; /* handle to mem alloc'ed */
/* Get a block big enough to hold the version information */
hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
lpstrVffInfo = GlobalLock(hMem);
/* Get the version information */
GetFileVersionInfo(szFullPath, 0L, dwVerInfoSize, lpstrVffInfo);
/* free memory */
GlobalUnlock(hMem);
GlobalFree(hMem);
}
hWinDll = LoadLibrary(UNZ_DLL_NAME);
#ifndef WIN32
if (hWinDll > HINSTANCE_ERROR)
#else
if (hWinDll != NULL)
#endif
{
DllProcessZipFiles = GetProcAddress(hWinDll, "DllProcessZipFiles");
GetDllVersion = GetProcAddress(hWinDll, "GetDllVersion");
}
else
{
char str[80];
wsprintf (str, "Cannot find %s", UNZ_DLL_NAME);
MessageBox (hWndMain, str, szAppName, MB_ICONSTOP | MB_OK);
GlobalUnlock(hStrings);
GlobalFree(hStrings);
GlobalUnlock(hDCL);
GlobalFree(hDCL);
return 0;
}
/* If, for some reason we got a dll with the same name, we don't want to
* make a call out to never-never land. At some point we should put a message
* up saying we can't load the proper dll.
*/
if (DllProcessZipFiles == NULL)
{
FreeLibrary(hWinDll);
GlobalUnlock(hStrings);
GlobalFree(hStrings);
GlobalUnlock(hDCL);
GlobalFree(hDCL);
return 0;
}
/* We need a check here in case an old beta version of the dll is out there */
if (GetDllVersion != NULL)
{
(*GetDllVersion)(&dwVersion);
dllMinor = LOWORD(dwVersion);
dllMajor = HIWORD(dwVersion);
/* This is just a place holder for now, but this is where we need to
* do whatever it is we decide to do when the dll version doesn't match
*/
if ((dllMajor != DLL_MAJOR) && (dllMinor != DLL_MINOR))
{
}
}
#endif
#ifndef WIN32
if (_fstrlen(lpCmdLine)) /* if filename passed on start-up */
#else
if (strlen(lpCmdLine)) /* if filename passed on start-up */
#endif
{
if ((ofretval = OpenFile(lpCmdLine, &lpumb->of, OF_EXIST)) >= 0)
lstrcpy(lpumb->szFileName, lpumb->of.szPathName); /* save file name */
}
/* If first time using WizUnzip 3.0, migrate any of earlier WizUnZip options from WIN.INI
to WIZUNZIP.INI.
*/
GetPrivateProfileString(szAppName, szFirstUse, szYes, lpumb->szBuffer, 256, szWizUnzipIniFile);
if ((fFirstUse = !lstrcmpi(lpumb->szBuffer, szYes))!=0) /* first time used as WizUnZip 3.0 */
{
#ifndef WIZZIP
GetProfileString(szAppName, szRecreateDirsKey, szYes, lpumb->szBuffer, OPTIONS_BUFFER_LEN);
WritePrivateProfileString(szAppName, szRecreateDirsKey, lpumb->szBuffer, szWizUnzipIniFile);
/* Don't propagate translate option. Its meaning has changed. Use default: No */
GetProfileString(szAppName, szOverwriteKey, szNo, lpumb->szBuffer, OPTIONS_BUFFER_LEN);
WritePrivateProfileString(szAppName, szOverwriteKey, lpumb->szBuffer, szWizUnzipIniFile);
GetProfileString(szAppName, szFormatKey, "long", lpumb->szBuffer, OPTIONS_BUFFER_LEN);
WritePrivateProfileString(szAppName, szFormatKey, lpumb->szBuffer, szWizUnzipIniFile);
GetProfileString(szAppName, szUnzipToZipDirKey, szNo, lpumb->szBuffer, OPTIONS_BUFFER_LEN);
WritePrivateProfileString(szAppName, szUnzipToZipDirKey, lpumb->szBuffer, szWizUnzipIniFile);
GetProfileString(szAppName, szLBSelectionKey, "display", lpumb->szBuffer, OPTIONS_BUFFER_LEN);
WritePrivateProfileString(szAppName, szLBSelectionKey, lpumb->szBuffer, szWizUnzipIniFile);
MigrateSoundOptions(); /* Translate former beep option to new sound option */
WriteProfileString(szAppName, NULL, NULL); /* delete [wizunzip] section of WIN.INI file */
#endif /* !WizZip */
/* Flag that this is no longer the first time. */
WritePrivateProfileString(szAppName, szFirstUse, szNo, szWizUnzipIniFile);
/* After first use, all options come out of WIZUNZIP.INI file */
}
/* Get initial Re-create dirs flag */
GetPrivateProfileString(szAppName, szRecreateDirsKey, szYes, lpumb->szBuffer, OPTIONS_BUFFER_LEN, szWizUnzipIniFile);
uf.fRecreateDirs = (BOOL)(!lstrcmpi(lpumb->szBuffer, szYes));
/* Get show toolbar help flag */
GetPrivateProfileString(szAppName, szShowBubbleHelpKey, szYes, lpumb->szBuffer, OPTIONS_BUFFER_LEN, szWizUnzipIniFile);
uf.fShowBubbleHelp = (BOOL)(!lstrcmpi(lpumb->szBuffer, szYes));
/* Get translate flag */
GetPrivateProfileString(szAppName, szTranslateKey, szNo, lpumb->szBuffer, OPTIONS_BUFFER_LEN, szWizUnzipIniFile);
uf.fTranslate = (BOOL)(!lstrcmpi(lpumb->szBuffer, szYes));
/* Get initial display format: short or long */
GetPrivateProfileString(szAppName, szFormatKey, "long", lpumb->szBuffer, OPTIONS_BUFFER_LEN, szWizUnzipIniFile);
uf.fFormatLong = (WORD)(!lstrcmpi(lpumb->szBuffer, "long") ? 1 : 0);
/* Get overwrite option */
GetPrivateProfileString(szAppName, szOverwriteKey, szNo, lpumb->szBuffer, OPTIONS_BUFFER_LEN, szWizUnzipIniFile);
lpDCL->Overwrite = (BOOL)(!lstrcmpi(lpumb->szBuffer, szYes));
/* Get prompt to overwrite option */
GetPrivateProfileString(szAppName, szPromptOverwriteKey, szNo, lpumb->szBuffer, OPTIONS_BUFFER_LEN, szWizUnzipIniFile);
lpDCL->PromptToOverwrite = (BOOL)(!lstrcmpi(lpumb->szBuffer, szYes));
/* Get always save zip-to dir option */
GetPrivateProfileString(szAppName, szSaveUnZipToKey, szNo, lpumb->szBuffer, OPTIONS_BUFFER_LEN, szWizUnzipIniFile);
uf.fSaveUnZipToDir = (BOOL)(!lstrcmpi(lpumb->szBuffer, szYes));
/* Get always save zip-from dir option */
GetPrivateProfileString(szAppName, szSaveUnZipFromKey, szNo, lpumb->szBuffer, OPTIONS_BUFFER_LEN, szWizUnzipIniFile);
uf.fSaveUnZipFromDir = (BOOL)(!lstrcmpi(lpumb->szBuffer, szYes));
/* Get Unzip to .ZIP dir option: yes or no */
GetPrivateProfileString(szAppName, szUnzipToZipDirKey, szNo, lpumb->szBuffer, OPTIONS_BUFFER_LEN, szWizUnzipIniFile);
uf.fUnzipToZipDir = (BOOL)(!lstrcmpi(lpumb->szBuffer, szYes));
/* Get default "unzip-to" directory */
GetPrivateProfileString(szAppName, szDefaultUnzipToDir, "", lpumb->szUnzipToDirName, WIZUNZIP_MAX_PATH, szWizUnzipIniFile);
/* Get Automatically Clear Status Window option */
GetPrivateProfileString(szAppName, szAutoClearStatusKey, szNo, lpumb->szBuffer, OPTIONS_BUFFER_LEN, szWizUnzipIniFile);
uf.fAutoClearStatus = (BOOL)(!lstrcmpi(lpumb->szBuffer, szYes));
/* Get Automatically Clear Display Window option */
GetPrivateProfileString(szAppName, szAutoClearDisplayKey, szNo, lpumb->szBuffer, OPTIONS_BUFFER_LEN, szWizUnzipIniFile);
uf.fAutoClearDisplay = (BOOL)(!lstrcmpi(lpumb->szBuffer, szYes));
/* Get default "unzip-from" directory */
GetPrivateProfileString(szAppName, szDefaultUnzipFromDir, "", lpumb->szUnzipFromDirName, WIZUNZIP_MAX_PATH, szWizUnzipIniFile);
/* Get default listbox selection operation */
GetPrivateProfileString(szAppName, szLBSelectionKey, "display", lpumb->szBuffer, OPTIONS_BUFFER_LEN, szWizUnzipIniFile);
for (i = 0; i < LBSELECTIONTABLE_ENTRIES &&
lstrcmpi(LBSelectionTable[i], lpumb->szBuffer) ; i++);
InitSoundOptions(); /* initialize sound options */
wLBSelection = IDM_LB_DISPLAY; /* assume default is to display */
if (i < LBSELECTIONTABLE_ENTRIES)
wLBSelection = (WORD) (IDM_LB_EXTRACT + i);
hWndMain = CreateWindow(szAppName, /* window class */
szAppName, /* window name */
WS_OVERLAPPEDWINDOW, /* window style */
0, /* x position */
0, /* y position */
CW_USEDEFAULT, /* width */
0, /* height */
(HWND)0, /* parent handle */
(HWND)0, /* menu or child ID */
hInstance, /* instance */
NULL); /* additional info */
if ( !hWndMain )
return 0;
CreateButtonBar(hWndMain);
#ifdef USEWIZUNZDLL
lpDCL->hWndMain = hWndMain;
lpDCL->hWndList = hWndList;
lpDCL->hInst = hInst;
#endif
UpdateButtons(hWndMain);
SizeWindow(hWndMain, TRUE);
/* Enable/Disable buttons */
WinAssert(hSelectAll);
EnableWindow( hSelectAll, FALSE);
WinAssert(hDeselectAll);
EnableWindow( hDeselectAll, FALSE);
WinAssert(hSelectPattern);
EnableWindow( hSelectPattern, FALSE);
/* On first use, throw up About box, saying what WizUnZip is, etc. */
if (fFirstUse)
{
PostMessage(hWndMain, WM_COMMAND, IDM_ABOUT, 0L);
}
hHelpCursor = LoadCursor(hInstance, "HelpCursor");
WinAssert(hWndMain);
ShowWindow(hWndMain, nCmdShow);
UpdateWindow(hWndMain);
while ( GetMessage(&lpumb->msg, 0, 0, 0) )
{
if (hPatternSelectDlg == 0 || /* Pattern select dialog is non-modal */
!IsDialogMessage(hPatternSelectDlg, &lpumb->msg))
{
if ( !TranslateAccelerator(hWndMain, hAccTable, &lpumb->msg) )
{
TranslateMessage(&lpumb->msg);
DispatchMessage(&lpumb->msg);
}
}
}
/* Don't turn on compiler aliasing or C7 will move */
/* the following assignment after the GlobalFree() */
/* which contains the memory for pumb! */
i = (int)lpumb->msg.wParam;
GlobalUnlock( hStrings );
GlobalFree( hStrings );
GlobalUnlock(hDCL);
GlobalFree(hDCL);
#ifdef USEWIZUNZDLL
FreeLibrary(hWinDll);
#else
DESTROYGLOBALS();
#endif
return i;
}
#endif /* WIZUNZIPDLL */